package com.passer.toolbox.tfile.command;

import com.passer.toolbox.common.core.util.StringUtils;
import com.passer.toolbox.common.util.file.FileUtils;
import com.passer.toolbox.tfile.entity.TFile;

import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * 文件大小计算
 */
public class FileSize {

    public void starter(String filePath) {
        File file = new File(StringUtils.isEmpty(filePath) ? "." : filePath);
        if (!file.exists()) {
            System.out.println(filePath + " 文件不存在！");
            return;
        }
        if (file.isFile()) {
            System.out.println(file.getName() + '\t' + FileUtils.fileSizeUnitChange(file.length()));
            return;
        }
        long totalSize = 0L;
        File[] files = file.listFiles();
        if (files == null || files.length < 1) {
            System.out.println(file.getName() + "\t0B");
            return;
        }
        List<TFile> list = new ArrayList<>();
        for (File childFile : files) {
            TFile tFile = createTFile(childFile);
            totalSize += tFile.getLength();
            list.add(tFile);
        }
        list.stream().sorted(Comparator.comparing(TFile::getLength)).forEach(tFile -> System.out.println(tFile.getName() + '\t' + tFile.getSize() + tFile.getUnit()));
        System.out.println("\n文件夹总大小：" + FileUtils.fileSizeUnitChange(totalSize));
    }

    /**
     * 计算文件大小
     * 单位：字节 B
     * @param targetFile 要计算大小的文件或文件夹
     * @return 文件大小
     */
    private long calculateFileSize(File targetFile) {
        if (targetFile.isFile()) {
            return targetFile.length();
        }
        File[] files = targetFile.listFiles();
        if (files == null || files.length < 1) {
            return 0L;
        }
        long size = 0L;
        for (File file : files) {
            if (file.isFile()) {
                size += file.length();
            } else {
                size += calculateFileSize(file);
            }
        }
        return size;
    }

    private TFile createTFile(File file) {
        TFile tFile = new TFile();
        tFile.setName(file.getName());
        tFile.setLength(calculateFileSize(file));
        String fileSize = FileUtils.fileSizeUnitChange(tFile.getLength());
        String[] split = fileSize.split(" ");
        tFile.setSize(Double.parseDouble(split[0]));
        tFile.setUnit(split[1]);
        return tFile;
    }
}
